#pragma once

#include <compl.h>
#include <dinfra/bitmap.h>
/* slab指的是自带meta信息管理的block */
/* spmc faa heap */
/* 变成分配对象的方式 */ 
/* 线程拥有堆, 使用一个bitmap表示内存空闲状态 可在堆上分配 (clz)或者使用更快的二级clz方式找空闲块 O(n) */
/* 远程释放使用faa实现 */

/* 典型使用场景 faslab管理2MB的内存，负责64Kb-1MB的内存分配，通过对齐判断是否本层拥有 */

/* faslab私有 */
/* faslab本地申请-> 尝试减freecnt并申请 -> clz搜素并一定能获得内存 -> faa设置bitmap -> freecnt小于0进入丢弃逻辑
    获得remote freecnt->大于等于0则不丢弃 -> 小于0则丢弃
                                            ->小于0不回收[被丢弃]
    faslab本地释放-> 加freecnt -> faa设置bitmap -> ok 
    faslab远程释放-> faa设置bitmap -> faa加remote freecnt -> 如果等于0则回收
*/

/* 先写好尝试一下这个算法的正确性 */
/* 正常管理 16大小 4bitmap 4KB*/
typedef struct faslab{    

    void        *owner_heap; /* 拥有者 */
    sword_t     freecnt; /* 本地自由计数 */

    sword_t     remote_freecnt; /* 远程自由计数 */
    /* bitmap, 大小视slab大小而定 */
    bitmap_t    bmap[]; 
}faslab_t;

